#include <iostream>
using namespace std;

/*
            A
   +--------+--------+
   |        |        |
   B1       B2       B3
+--+--+  +--+--+  +--+--+
|  |  |  |  |  |  |  |  |
+  +  +  +  +  +  +  +  +
C1 C2 C3 D1 D2 D3 E1 E2 E3
 */

class A{
    private:
        int x;
    protected:
        int y;
    public:
        int z;
        A():x(1), y(1), z(1){}
};

// x是private变量，因此只能在A中访问，不能在任何其子类中访问
// y与z是protected与public变量，因此一定可以在其下一代任意一种继承模式中访问
class B1 : public A{
    void test(){/*x=1;*/y=1;z=1;}
};
class B2 : protected A{
    void test(){/*x=1;*/y=1;z=1;}
};
class B3 : private A{
    void test(){/*x=1;*/y=1;z=1;}
};

// public继承不会影响下一代类内的可见性
class C1 : public B1{
    void test(){/*x=1;*/y=1;z=1;}
};
class C2 : protected B1{
    void test(){/*x=1;*/y=1;z=1;}
};
class C3 : private B1{
    void test(){/*x=1;*/y=1;z=1;}
};

// protected继承不会影响下一代类内的可见性
class D1 : public B2{
    void test(){/*x=1;*/y=1;z=1;}
};
class D2 : protected B2{
    void test(){/*x=1;*/y=1;z=1;}
};
class D3 : private B2{
    void test(){/*x=1;*/y=1;z=1;}
};

// private继承导致下一代无法访问上一代任何成员
class E1 : public B3{
    void test(){/*x=1;y=1;z=1;*/}
};
class E2 : protected B3{
    void test(){/*x=1;y=1;z=1;*/}
};
class E3 : private B3{
    void test(){/*x=1;y=1;z=1;*/}
};

void TESTscope(){
    printf("\n======================= %s =========================\n", __func__);
    A a;
    B1 b1; B2 b2; B3 b3;
    C1 c1; C2 c2; C3 c3;
    D1 d1; D2 d2; D3 d3;
    E1 e1; E2 e2; E3 e3;

    // 注释的行表示不可在类外访问
    // 成员变量 x 与 y 是 private 与 protected 变量，因此不论哪种继承模式，都无法在类外访问
    // 只有经过public继承的public变量才可以在类外直接访问，一旦继承链中有private或protected继承，则无法访问
    cout << a.z << endl;
    cout << b1.z << endl;
    //cout << b2.z << endl;
    //cout << b3.z << endl;
    cout << c1.z << endl;
    //cout << c2.z << endl;
    //cout << c3.z << endl;
    //cout << d1.z << endl;
    //cout << d2.z << endl;
    //cout << d3.z << endl;
    //cout << e1.z << endl;
    //cout << e2.z << endl;
    //cout << e3.z << endl;
}

int main(){
    TESTscope();
    return 0;
}
